<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
	<link href="../css/style.css" rel="stylesheet" type="text/css">
</head><body>
<h1>3.5. Методы адресации</h1>
<p class="article">
Методы адресации можно разделить на два класса: адресация данных и адресация 
переходов. Все методы можно отнести к одной из следующих групп:
</p>
<h2>Прямая адресация.</h2>
<p class="article">
16-битный эффективный адрес (EA) операнда является частью команды:
</p>
<div class="image">
	<img src="../img/flat_address.png" />
</div>
<p class="article"> 
Пример: запись байта с адресом 0000h в регистр al
</p>
<pre class="code">
mov al, [0000h]
</pre>
<div class="noteclassic">
запись в квадратных скобках обозначает ячейку, адрес которой 
(смещение по отношению к DS) записан в квадратных скобках.
</div>
<h2>Регистровая адресация.</h2>
<p class="article">
Операнд содержится в определяемом командой регистре. 16-битный операнд может находиться в регистрах AX, BX, CX, DX, SI, DI, SP или BP, а 8-битный - в регистрах AH, AL, BH, BL, CH, CL, DH, DL:
</p>
<div class="image">
	<img src="../img/address_reg.png" />
</div>
<p class="article">
Пример: запись содержимого регистра bx, в регистр ax
</p>
<pre class="code">
mov ax, bx
</pre>
<h2>Косвенно-регистровая адресация.</h2>
<p class="article">
Эффективный адрес операнда находится в базовом регистре BX или индексном регистре (SI или DI):
</p>
<div class="image">
	<img src="../img/address_kos_reg.png" />
</div>
<p class="article">
Пример: запись содержимого ячейки памяти с адресом из регистра bx (смещение внутри сегмента DS), в регистр ax
</p>
<pre class="code">
mov ax, [bx]
</pre>
<p class="article">
Физический адрес определяется парой сегмент-смещение (например CS:IP – адрес следующей команды), и для каждого регистра, содержащего смещение, есть сегментный регистр, заданный по умолчанию. Некоторые сегменты разрешается принудительно переназначать, мнемоническое обозначение переназначения – «сегментный_регистр:смещение», в коде команды появляется дополнительный (первый) байт – байт замены сегмента.
</p>
<table border="1px">
	<tr>
		<td>Регистры, хранящие смещение</td>
		<td>Сегмент «по умолчанию»</td>
		<td>Возможная замена</td>
	</tr>
	<tr>
		<td>IP</td> 
		<td>CS</td>
		<td> -</td>
	</tr>
	<tr>
		<td>SP</td>
		<td>SS</td>
		<td> -</td>
	</tr>
	<tr>
		<td>BP</td>
		<td>SS</td>
		<td>CS, DS, ES</td>
	</tr>
	<tr>
		<td>BP+SI, BP+DI</td>
		<td>SS</td>
		<td>CS, DS, ES</td>
	</tr>
	<tr>
		<td>BX</td>
		<td>DS</td>
		<td>CS, DS, ES</td>
	</tr>
	<tr>
		<td>SI, DI (кроме адресации строк)</td>
		<td>DS</td>
		<td>CS, DS, ES</td>
	</tr>
	<tr>
		<td>SI (адресация строк)</td>
		<td>DS</td>
		<td>CS, DS, ES</td>
	</tr>
	<tr>
		<td>DI (адресация строк)</td>
		<td>ES</td>
		<td> - </td>
	</tr>
</table>
<p class="article">
Пример: pапись содержимого ячейки памяти с адресом из регистра bx (смещение внутри сегмента СS), в регистр ax
</p>
<pre class="code">
mov ax, cs:[bx]
</pre>
<h2>Непосредственная адресация.</h2>
<p class="article">
Операнд длиной байт или слово является частью команды. Операнд по мещается в последние байты команды, причем младший байт следует первым (находится по меньшему адресу).
</p>
<div class="image">
	<img src="../img/address_nepos.png" />
</div>
<p class="article">
Пример: запись операнда, указанного в команде, в регистр ax
</p>
<pre class="code">
mov ax, 1234h
</pre>
<h2>Относительная косвенно-регистровая адресация.</h2>
<p class="article">
Эффективный адрес операнда – сумма 8- или 16-разрядного смещения и значения одного из базовых или индексных регистров. Этот метод также называют базовым, если используются регистры BX, BP или индексным, при использовании SI, DI.
</p>
<div class="image">
	<img src="../img/address_otnos_kos_reg.png" />
</div>
<p class="article">
Базовая адресация обеспечивает возможность работы со структурами данных, размещенными в памяти, например, с соседними ячейками памяти относительно эффективного адреса в базовом регистре.
</p>
<p class="article">
Пример: запись содержимого ячейки памяти с EA (сегмент 8b4710 DS), определяемым как сумма содержимого bx и смещения в команде (100+10=110) в регистр ax
</p>
<pre class="code">
mov ax, [bx+10]		;первый вариант
mov ax, 10[bx]		;второй вариант
</pre>
<p class="article">
Индексный метод адресации удобен при обработке массивов, когда смещение указывает стартовый адрес массива, а содержимое индексного регистра соответствует индексу массива.
</p>
<p class="article">
Пример: запись содержимого ячейки памяти с EA (сегмент DS), определяемым как сумма содержимого si и смещения в команде (2+100=102) в регистр ax. Можно рассматривать значение si как индекс массива со стартовым адресом 100.
</p>
<pre class="code">
mov ax, 0100[si]		;первый вариант
mov ax, [si+0100]		;второй вариант
</pre>
<h2>Базовая индексная адресация.</h2>
<p class="article">
Эффективный адрес равен сумме содержимого базового (BX или BP) и индексного (SI или DI) регистров.
</p>
<div class="image">
	<img src="../img/address_base_index.png" />
</div>
<p class="article">
Пример: запись содержимого ячейки памяти с EA (сегмент DS), определяемым как сумма содержимого регист ров si, bx и смещения в команде (10+2+100=112) в регистр ax. Можно рассматривать значение si как индекс выбранного регистром bx одномерного мас         сива в двумерном массиве со стартовым адресом 100.
</p>
<pre class="code">
mov ax, 100[bx][si]		;первый вариант
mov ax, [bx+si+0100]		;второй вариант
</pre>
<h2>Неявная адресация.</h2>
<p class="article">
Неявная адресация задается операцией. Например, в командах обработки строк неявно используются регистры SI, DI. В командах управления циклами неявно используется регистр CX и т.д.
</p>
<h2>Стековая адресация.</h2>
<p class="article">
Стековая адресация применяется в командах работы со стеком PUSH и POP. Для этих команд адрес операнда находится в указателе стека SP и автоматически уменьшается или увеличивается на два при записи в стек или при чтении из стека. Заполнение стека происходит в направлении уменьшения адресов ячеек памяти. Стек может обмениваться данными с регистрами общего назначения и сегментными регистрами. Команды обмена данными между стеком и памятью содержат байт адресации, в котором 3-разрядное поле REG, совместно с полем КОП, идентифицирует команду.
</p>
<div class="image">
	<img src="../img/address_stack.png" />
</div>
<h2>Адресация переходов. Внутрисегментный прямой переход.</h2>
<p class="article">
Адрес следующей команды определяется суммированием смещения сознаком, представленным в двоично-дополнительном коде, и значения IP:
</p>
<div class="image">
	<img src="../img/jump_seg.png" />
</div>
<p class="article">
Пример: 
</p>
<pre class="code">
jmp [bx]
</pre>
<h2>Адресация переходов. Межсегментный прямой переход.</h2>
<p class="article">
Содержимое регистров CS и IP заменяются словами из команды:
</p>
<div class="image">
	<img src="../img/jump_seg_kos.png" />
</div>
<h2>Адресация переходов. Межсегментный косвенный переход.</h2>
<p class="article">
Содержимое регистров CS и IP заменяется словами, последовательно рас-
положенными в памяти. Слова могут быть указаны любым методом адре-
сации, кроме непосредственного:
</p>
<div class="image">
	<img src="../img/jump_outseg_kos.png" />
</div>
</body></html>
